/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.patpro.modelo.DAO.persistencia;

import com.patpro.modelo.DAO.interfaces.AlumnoNotaInterfaz;
import com.patpro.modelo.javabeans.Alumno;
import com.patpro.modelo.javabeans.AlumnoNota;
import com.patpro.modelo.javabeans.AsignacionAcademica;
import com.patpro.modelo.javabeans.Curso;
import com.patpro.modelo.javabeans.Profesor;
import com.patpro.modelo.javabeans.SemestreAcademico;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

/**

 */
public class AlumnoNotaJDBCPersistence implements AlumnoNotaInterfaz {

    private JdbcTemplate plantilla;

    public JdbcTemplate getPlantilla() {
        return plantilla;
    }

    public void setPlantilla(JdbcTemplate plantilla) {
        this.plantilla = plantilla;
    }
    
    public int insertarAlumnoNota(AlumnoNota alumno_nota) {
        String sql = "insert into t_alumnocurso(T_Curso_ID,T_Semestre_Academico_ID,T_asignacionAcademica_T_Persona_ID,T_Persona_ID) values(?,?,?,?) ";
	return plantilla.update (sql,
                           new Object[] {
                                 alumno_nota.getCurso().getId_curso(),
                                 alumno_nota.getSemestre().getId_semestre(),
                                 alumno_nota.getProfesor().getId_persona(),
                                 alumno_nota.getAlumno().getId_persona()
                              });
    }

    public int actualizarAlumnoNota(AlumnoNota alumno_nota) {
        BigDecimal nota_final = (alumno_nota.getNota1().multiply(new BigDecimal("0.2")).add(
                                alumno_nota.getNota2().multiply(new BigDecimal("0.2"))).add(
                                alumno_nota.getNota3().multiply(new BigDecimal("0.3"))).add(
                                alumno_nota.getNota4().multiply(new BigDecimal("0.3")))).setScale(0, RoundingMode.CEILING);
        String sql = "update t_alumnocurso set nota1=?,nota2=?,nota3=?,nota4=?,notaFinal=? where T_Curso_ID=? and T_Semestre_Academico_ID =? and T_asignacionAcademica_T_Persona_ID=? and T_Persona_ID=? ";
	return plantilla.update (sql,
                           new Object[] {
                                 alumno_nota.getNota1(),
                                 alumno_nota.getNota2(),
                                 alumno_nota.getNota3(),
                                 alumno_nota.getNota4(),
                                 nota_final,
                                 alumno_nota.getCurso().getId_curso(),
                                 alumno_nota.getSemestre().getId_semestre(),
                                 alumno_nota.getProfesor().getId_persona(),
                                 alumno_nota.getAlumno().getId_persona()
                              });
    }

    public List<AlumnoNota> listarAlumnoNota(AsignacionAcademica asignacion) {
        String template = "SELECT"+
                          "  t_alumnocurso.T_Curso_ID,"+
                          "  t_alumnocurso.T_Semestre_Academico_ID,"+
                          "  t_alumnocurso.T_asignacionAcademica_T_Persona_ID,"+
                          "  t_alumnocurso.T_Persona_ID,"+
                          "  t_curso.descripcion as desc_curso,"+
                          "  t_semestre_academico.descripcion as desc_semestre,"+
                          "  concat(concat(t_persona.apellidos,' '),t_persona.nombres) as nombre_profesor,"+
                          "  concat(concat(t1.apellidos,' '),t1.nombres) as nombre_alumno,"+
                          "  t_alumnocurso.nota1,t_alumnocurso.nota2,t_alumnocurso.nota3,t_alumnocurso.nota4,t_alumnocurso.notaFinal"+
                          "  FROM"+
                          "  t_alumnocurso"+
                          "  Inner Join t_curso ON t_curso.T_Curso_ID = t_alumnocurso.T_Curso_ID"+
                          "  Inner Join t_semestre_academico ON t_semestre_academico.T_Semestre_Academico_ID = t_alumnocurso.T_Semestre_Academico_ID"+
                          "  Inner Join t_profesor ON t_profesor.T_Persona_ID = t_alumnocurso.T_asignacionAcademica_T_Persona_ID"+
                          "  Inner Join t_alumno ON t_alumno.T_Persona_ID = t_alumnocurso.T_Persona_ID"+
                          "  Inner Join t_persona ON t_persona.T_Persona_ID = t_profesor.T_Persona_ID"+
                          "  Inner Join t_persona AS t1 ON t1.T_Persona_ID = t_alumno.T_Persona_ID"+
                          " where t_alumnocurso.T_Semestre_Academico_ID=? and t_alumnocurso.T_Curso_ID=? and t_alumnocurso.T_asignacionAcademica_T_Persona_ID=?";

         List resultado = plantilla.query(template,new Object[]{
                                                asignacion.getSemestre().getId_semestre(),
                                                asignacion.getCurso().getId_curso(),
                                                asignacion.getProfesor().getId_persona()
                                                },
                                    new RowMapper(){
                                        public Object mapRow(ResultSet rs,int rowNum)throws SQLException,
                                                DataAccessException{
                                            AlumnoNota alumnonota = new AlumnoNota();

                                            SemestreAcademico semestre = new SemestreAcademico();
                                            semestre.setId_semestre(rs.getInt("T_Semestre_Academico_ID"));
                                            semestre.setDescripcion(rs.getString("desc_semestre"));

                                            Curso curso = new Curso();
                                            curso.setId_curso(rs.getInt("T_Curso_ID"));
                                            curso.setDescripcion(rs.getString("desc_curso"));

                                            Profesor profesor = new Profesor();
                                            profesor.setId_persona(rs.getInt("T_asignacionAcademica_T_Persona_ID"));
                                            profesor.setNombres(rs.getString("nombre_profesor"));

                                            Alumno alumno = new Alumno();
                                            alumno.setId_persona(rs.getInt("T_Persona_ID"));
                                            alumno.setNombres(rs.getString("nombre_alumno"));

                                            alumnonota.setSemestre(semestre);
                                            alumnonota.setCurso(curso);
                                            alumnonota.setProfesor(profesor);
                                            alumnonota.setAlumno(alumno);
                                            alumnonota.setNota1(rs.getBigDecimal("nota1"));
                                            alumnonota.setNota2(rs.getBigDecimal("nota2"));
                                            alumnonota.setNota3(rs.getBigDecimal("nota3"));
                                            alumnonota.setNota4(rs.getBigDecimal("nota4"));
                                            alumnonota.setNotaFinal(rs.getBigDecimal("notaFinal"));
                                            return alumnonota;
                                        }
                                    });
         return resultado;
    }

    public List<AlumnoNota> listarAlumnoNotaPorSemestreyAlumno(SemestreAcademico semestre, Alumno alumno) {
        String template = "SELECT"+
                          "  t_alumnocurso.T_Curso_ID,"+
                          "  t_alumnocurso.T_Semestre_Academico_ID,"+
                          "  t_alumnocurso.T_asignacionAcademica_T_Persona_ID,"+
                          "  t_alumnocurso.T_Persona_ID,"+
                          "  t_curso.descripcion as desc_curso,"+
                          "  t_semestre_academico.descripcion as desc_semestre,"+
                          "  concat(concat(t_persona.apellidos,' '),t_persona.nombres) as nombre_profesor,"+
                          "  concat(concat(t1.apellidos,' '),t1.nombres) as nombre_alumno,"+
                          "  t_alumnocurso.nota1,t_alumnocurso.nota2,t_alumnocurso.nota3,t_alumnocurso.nota4,t_alumnocurso.notaFinal"+
                          "  FROM"+
                          "  t_alumnocurso"+
                          "  Inner Join t_curso ON t_curso.T_Curso_ID = t_alumnocurso.T_Curso_ID"+
                          "  Inner Join t_semestre_academico ON t_semestre_academico.T_Semestre_Academico_ID = t_alumnocurso.T_Semestre_Academico_ID"+
                          "  Inner Join t_profesor ON t_profesor.T_Persona_ID = t_alumnocurso.T_asignacionAcademica_T_Persona_ID"+
                          "  Inner Join t_alumno ON t_alumno.T_Persona_ID = t_alumnocurso.T_Persona_ID"+
                          "  Inner Join t_persona ON t_persona.T_Persona_ID = t_profesor.T_Persona_ID"+
                          "  Inner Join t_persona AS t1 ON t1.T_Persona_ID = t_alumno.T_Persona_ID"+
                          " where t_alumnocurso.T_Semestre_Academico_ID=? and t_alumnocurso.T_Persona_ID=? ";

         List resultado = plantilla.query(template,new Object[]{
                                                semestre.getId_semestre(),
                                                alumno.getId_persona()
                                                },
                                    new RowMapper(){
                                        public Object mapRow(ResultSet rs,int rowNum)throws SQLException,
                                                DataAccessException{
                                            AlumnoNota alumnonota = new AlumnoNota();

                                            SemestreAcademico semestre = new SemestreAcademico();
                                            semestre.setId_semestre(rs.getInt("T_Semestre_Academico_ID"));
                                            semestre.setDescripcion(rs.getString("desc_semestre"));

                                            Curso curso = new Curso();
                                            curso.setId_curso(rs.getInt("T_Curso_ID"));
                                            curso.setDescripcion(rs.getString("desc_curso"));

                                            Profesor profesor = new Profesor();
                                            profesor.setId_persona(rs.getInt("T_asignacionAcademica_T_Persona_ID"));
                                            profesor.setNombres(rs.getString("nombre_profesor"));

                                            Alumno alumno = new Alumno();
                                            alumno.setId_persona(rs.getInt("T_Persona_ID"));
                                            alumno.setNombres(rs.getString("nombre_alumno"));

                                            alumnonota.setSemestre(semestre);
                                            alumnonota.setCurso(curso);
                                            alumnonota.setProfesor(profesor);
                                            alumnonota.setAlumno(alumno);
                                            alumnonota.setNota1(rs.getBigDecimal("nota1"));
                                            alumnonota.setNota2(rs.getBigDecimal("nota2"));
                                            alumnonota.setNota3(rs.getBigDecimal("nota3"));
                                            alumnonota.setNota4(rs.getBigDecimal("nota4"));
                                            alumnonota.setNotaFinal(rs.getBigDecimal("notaFinal"));
                                            return alumnonota;
                                        }
                                    });
         return resultado;
    }

    public int eliminarAlumnoNota(AlumnoNota alumno_nota) {
        String sql = "delete from t_alumnocurso  where T_Curso_ID =? and T_Semestre_Academico_ID=? and T_asignacionAcademica_T_Persona_ID=? and T_Persona_ID=?  ";
	return plantilla.update (sql,
                           new Object[] {
                                 alumno_nota.getCurso().getId_curso(),
                                 alumno_nota.getSemestre().getId_semestre(),
                                 alumno_nota.getProfesor().getId_persona(),
                                 alumno_nota.getAlumno().getId_persona()
                              });
    }

    public AlumnoNota buscarAlumnoNota(AlumnoNota alumno_curso) {
        String template = "SELECT"+
                          "  t_alumnocurso.T_Curso_ID,"+
                          "  t_alumnocurso.T_Semestre_Academico_ID,"+
                          "  t_alumnocurso.T_asignacionAcademica_T_Persona_ID,"+
                          "  t_alumnocurso.T_Persona_ID,"+
                          "  t_curso.descripcion as desc_curso,"+
                          "  t_semestre_academico.descripcion as desc_semestre,"+
                          "  concat(concat(t_persona.apellidos,' '),t_persona.nombres) as nombre_profesor,"+
                          "  concat(concat(t1.apellidos,' '),t1.nombres) as nombre_alumno,"+
                          "  t_alumnocurso.nota1,t_alumnocurso.nota2,t_alumnocurso.nota3,t_alumnocurso.nota4,t_alumnocurso.notaFinal"+
                          "  FROM"+
                          "  t_alumnocurso"+
                          "  Inner Join t_curso ON t_curso.T_Curso_ID = t_alumnocurso.T_Curso_ID"+
                          "  Inner Join t_semestre_academico ON t_semestre_academico.T_Semestre_Academico_ID = t_alumnocurso.T_Semestre_Academico_ID"+
                          "  Inner Join t_profesor ON t_profesor.T_Persona_ID = t_alumnocurso.T_asignacionAcademica_T_Persona_ID"+
                          "  Inner Join t_alumno ON t_alumno.T_Persona_ID = t_alumnocurso.T_Persona_ID"+
                          "  Inner Join t_persona ON t_persona.T_Persona_ID = t_profesor.T_Persona_ID"+
                          "  Inner Join t_persona AS t1 ON t1.T_Persona_ID = t_alumno.T_Persona_ID"+
                          " where t_alumnocurso.T_Semestre_Academico_ID=? and t_alumnocurso.T_Curso_ID=? and t_alumnocurso.T_asignacionAcademica_T_Persona_ID=? and t_alumnocurso.T_Persona_ID=? ";

          List<AlumnoNota> resultado = plantilla.query(template,new Object[]{
                                                alumno_curso.getSemestre().getId_semestre(),
                                                alumno_curso.getCurso().getId_curso(),
                                                alumno_curso.getProfesor().getId_persona(),
                                                alumno_curso.getAlumno().getId_persona()
                                                },
                                    new RowMapper(){
                                        public Object mapRow(ResultSet rs,int rowNum)throws SQLException,
                                                DataAccessException{
                                            AlumnoNota alumnonota = new AlumnoNota();

                                            SemestreAcademico semestre = new SemestreAcademico();
                                            semestre.setId_semestre(rs.getInt("T_Semestre_Academico_ID"));
                                            semestre.setDescripcion(rs.getString("desc_semestre"));

                                            Curso curso = new Curso();
                                            curso.setId_curso(rs.getInt("T_Curso_ID"));
                                            curso.setDescripcion(rs.getString("desc_curso"));

                                            Profesor profesor = new Profesor();
                                            profesor.setId_persona(rs.getInt("T_asignacionAcademica_T_Persona_ID"));
                                            profesor.setNombres(rs.getString("nombre_profesor"));

                                            Alumno alumno = new Alumno();
                                            alumno.setId_persona(rs.getInt("T_Persona_ID"));
                                            alumno.setNombres(rs.getString("nombre_alumno"));

                                            alumnonota.setSemestre(semestre);
                                            alumnonota.setCurso(curso);
                                            alumnonota.setProfesor(profesor);
                                            alumnonota.setAlumno(alumno);
                                            alumnonota.setNota1(rs.getBigDecimal("nota1"));
                                            alumnonota.setNota2(rs.getBigDecimal("nota2"));
                                            alumnonota.setNota3(rs.getBigDecimal("nota3"));
                                            alumnonota.setNota4(rs.getBigDecimal("nota4"));
                                            alumnonota.setNotaFinal(rs.getBigDecimal("notaFinal"));
                                            return alumnonota;
                                        }
                                    });
         return (resultado.size()>0)?(AlumnoNota)resultado.get(0) :null;
    }

}
